#include <iostream>
#include <signal.h>
#include <unistd.h>

// 打印pending表
void showPending(sigset_t &pendingSet)
{
    for (size_t i = 31; i > 0; i--)
    {
        if (sigismember(&pendingSet, i))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << std::endl;
}

//信号自定义执行方法
void handler(int signo)
{
    std::cout << "执行信号2" << std::endl;
}

int main()
{
    // 1.创建阻塞信号集和未决信号集
    sigset_t blockSet, oldBlockSet; // 创建阻塞信号集和原始阻塞信号集
    sigset_t pendingSet;            // 创建未决信号集

    // 2.初始化信号集,置空
    sigemptyset(&blockSet);
    sigemptyset(&oldBlockSet);
    sigemptyset(&pendingSet);

    // 3.设置信号集
    sigaddset(&blockSet, 2); // 将2号信号添加到阻塞信号集中

    // 4.添加到进程内部
    sigprocmask(SIG_SETMASK, &blockSet, &oldBlockSet); // 2号信号被阻塞
    std::cout << "信号:2阻塞" << std::endl;

    //捕捉信号2
    signal(2, handler);

    int cnt = 0;
    while (true)
    {
        // 5.查看pendding未决表
        sigpending(&pendingSet); // 获取pending表
        showPending(pendingSet); // 打印pending表
        sleep(1);
        if (cnt++ == 5)
        {
            std::cout << "信号:2解开阻塞" << std::endl;
            sigprocmask(SIG_UNBLOCK, &blockSet, nullptr); // 2号信号被解开阻塞
            sleep(1);
        }
    }

    return 0;
}